﻿using UnityEngine;
using FairyGUI;
using DG.Tweening;

public class ScrollPaneMain : MonoBehaviour
{
	GComponent _mainView;
	GList _list;

	void Awake()
	{
		Application.targetFrameRate = 60;
		Stage.inst.onKeyDown.Add(OnKeyDown);
	}

	void Start()
	{
		_mainView = this.GetComponent<UIPanel>().ui;

		_list = _mainView.GetChild("list").asList;
		_list.itemRenderer = RenderListItem;
		_list.SetVirtual();
		_list.numItems = 1000;
		_list.onTouchBegin.Add(OnClickList);

		_mainView.GetChild("box").asCom.onDrop.Add(OnDrop);

		LongPressGesture gesture = new LongPressGesture(_list);
		gesture.once = true;
		gesture.trigger = 1f;
		gesture.onAction.Add(OnLongPress);
	}

	void RenderListItem(int index, GObject obj)
	{
		GButton item = obj.asButton;
		item.title = "Item " + index;
		item.scrollPane.posX = 0; //reset scroll pos

		//Be carefull, RenderListItem is calling repeatedly, dont call 'Add' here!
		//请注意，RenderListItem是重复调用的，不要使用Add增加侦听！
		item.GetChild("b0").onClick.Set(OnClickStick);
		item.GetChild("b1").onClick.Set(OnClickDelete);
	}

	void OnClickList(EventContext context)
	{
		//find out if there is an item in edit status
		//查找是否有项目处于编辑状态
		int cnt = _list.numChildren;
		for (int i = 0; i < cnt; i++)
		{
			GButton item = _list.GetChildAt(i).asButton;
			if (item.scrollPane.posX != 0)
			{
				//Check if clicked on the button
				if (item.GetChild("b0").asButton.IsAncestorOf(GRoot.inst.touchTarget)
					|| item.GetChild("b1").asButton.IsAncestorOf(GRoot.inst.touchTarget))
				{
					return;
				}
				item.scrollPane.SetPosX(0, true);
				//avoid scroll pane default behavior
				//取消滚动面板可能发生的拉动。
				item.scrollPane.CancelDragging();
				_list.scrollPane.CancelDragging();
				break;
			}
		}
	}

	void OnLongPress(EventContext context)
	{
		//find out which item is under finger
		//逐层往上知道查到点击了那个item
		GObject obj = GRoot.inst.touchTarget;
		GObject p = obj.parent;
		while (p != null)
		{
			if (p == _list)
				break;

			p = p.parent;
		}

		if (p == null)
			return;
		Debug.Log(obj.text);
		DragDropManager.inst.StartDrag(obj, obj.icon, obj.text);
	}

	void OnDrop(EventContext context)
	{
		_mainView.GetChild("txt").text = "Drop " + (string)context.data;
	}

	void OnClickStick(EventContext context)
	{
		_mainView.GetChild("txt").text = "Stick " + (((GObject)context.sender).parent).text;
	}

	void OnClickDelete(EventContext context)
	{
		_mainView.GetChild("txt").text = "Delete " + (((GObject)context.sender).parent).text;
	}

	void OnKeyDown(EventContext context)
	{
		if (context.inputEvent.keyCode == KeyCode.Escape)
		{
			Application.Quit();
		}
	}
}